#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
#include<thread>
#include<mutex>
#include<queue>
#include<functional>

using namespace std;

template<class T>
void func(T x)
{
	decltype(x) y = x;
	cout << typeid(y).name() << endl;
}

int main()
{
	func(2);
	func(2.2);
	func("22");
	return 0;
}

//void process(int& x)
//{
//	cout << "process int&" << endl;
//}
//
//void process(int&& x)
//{
//	cout << "process int&&" << endl;
//}
//
//template<class T>
//void func(T&& x)
//{
//	process(forward<T>(x));
//}
//
//int main()
//{
//	int a = 12;
//
//	func(a);
//	func(125);
//	func(move(a));
//	return 0;
//}

//void sum(int&& x)
//{
//	if (x > 10)	return;
//	sum(x + 3);
//}
//
//int main()
//{
//	int x = 5;
//	sum(move(x));
//	return 0;
//}

//class A
//{
//public:
//	int func(int x, int y)
//	{
//		return x - y;
//	}
//};
//
//int main()
//{
//	A a;
//	auto f = bind(&A::func, &a, placeholders::_1, placeholders::_2);
//	cout << f(9, 1) << endl;
//	auto f2 = bind(&A::func, &a, placeholders::_2, placeholders::_1);
//	cout << f2(9, 1) << endl;
//	return 0;
//}

//condition_variable cv_pro,cv_con;
//mutex m;
//queue<int> q;
//
//void producer()
//{
//	for (int i = 0; i < 10; i++)
//	{
//		unique_lock<mutex> lock(m);
//		cv_pro.wait(lock, [] { return q.empty(); });
//		q.push(i);
//		cout << "produce data: " << i << endl;
//		cv_con.notify_one();
//	}
//}
//
//void consumer()
//{
//	while (true)
//	{
//		unique_lock<mutex> lock(m);
//		cv_con.wait(lock, [] {return !q.empty(); });
//		int t = q.front();
//		q.pop();
//		cout << "get data " << t << endl;
//		cv_pro.notify_one();
//	}
//}
//
//int main()
//{
//	thread t1(producer);
//	thread t2(consumer);
//
//	t1.join();
//	t2.join();
//	return 0;
//}


//mutex m;
//int t = 0;
//
//void getticket(int num)
//{
//	while(t < 100)
//	{
//		m.lock();
//		if (t < 100)
//			cout << "thread " << num << " get ticket " << ++t << endl;
//		m.unlock();
//	}
//}
//
//int main()
//{
//	thread t1(getticket, 1);
//	thread t2(getticket, 2);
//
//	t1.join();
//	t2.join();
//
//	return 0;
//}